Introducción a Tidydata y al uso de las funciones de pivot_longer y pivot_wider

🔴 1. Introducción a tidydata

Fig.01: Julie Lowndes y Allison Horst, 2020, Tidy data for Efficiency, Reproducibility, and Collaboration

Dentro de cualquier análisis estadístico el mayor tiempo destinado está en función al ordenamiento y entendimiento de los datos. Tener datos ordenados (tidydata) significa tener una base datos con estructuras adecuadas, donde cada registro representa una fila, cada variable representa una columna y cada celda contiene una simple medida (Hadley Wickham,2014). En la siguiente imagen se adjunta una infografía donde se detalla este concepto.

Fig.02: Julie Lowndes y Allison Horst, 2020, Tidy data for Efficiency, Reproducibility, and Collaboration

Sin embargo un tidydata puede estar representado en multiples formas, y esto lo podemos observar en las siguientes estructuras.

table1
#> # A tibble: 6 x 4
#>   country      year  cases population
#>   <chr>       <int>  <int>      <int>
#> 1 Afghanistan  1999    745   19987071
#> 2 Afghanistan  2000   2666   20595360
#> 3 Brazil       1999  37737  172006362
#> 4 Brazil       2000  80488  174504898
#> 5 China        1999 212258 1272915272
#> 6 China        2000 213766 1280428583
table2
#> # A tibble: 12 x 4
#>   country      year type           count
#>   <chr>       <int> <chr>          <int>
#> 1 Afghanistan  1999 cases            745
#> 2 Afghanistan  1999 population  19987071
#> 3 Afghanistan  2000 cases           2666
#> 4 Afghanistan  2000 population  20595360
#> 5 Brazil       1999 cases          37737
#> 6 Brazil       1999 population 172006362
#> # … with 6 more rows
table3
#> # A tibble: 6 x 3
#>   country      year rate             
#> * <chr>       <int> <chr>            
#> 1 Afghanistan  1999 745/19987071     
#> 2 Afghanistan  2000 2666/20595360    
#> 3 Brazil       1999 37737/172006362  
#> 4 Brazil       2000 80488/174504898  
#> 5 China        1999 212258/1272915272
#> 6 China        2000 213766/1280428583

# Spread across two tibbles
table4a  # cases
#> # A tibble: 3 x 3
#>   country     `1999` `2000`
#> * <chr>        <int>  <int>
#> 1 Afghanistan    745   2666
#> 2 Brazil       37737  80488
#> 3 China       212258 213766
table4b  # population
#> # A tibble: 3 x 3
#>   country         `1999`     `2000`
#> * <chr>            <int>      <int>
#> 1 Afghanistan   19987071   20595360
#> 2 Brazil       172006362  174504898
#> 3 China       1272915272 1280428583

Finalmente, tener un tidydata nos permite tener muchas ventajas desde ser más eficientes en nuestro análisis,tener una mayor facilidad al momento de colaborar con multiples usarios y realizar practicas de reproducibilidad.

Fig.03: Julie Lowndes y Allison Horst, 2020, Tidy data for Efficiency, Reproducibility, and Collaboration

🔴 2. Manipulando datos desordenados para optener datos en estructura tidy

Para este ejemplo usaremos una base de datos que contiene casos de personas fallecidas a causa del coranovirus a nivel de país, este dataset está alojada en el siguiente repositorio de GitHub (click aquí) del Portal de datos abiertos.

Fig. 04: Personas fallecidas por coranovirus a nivel global

✅ 2.1 Lectura de datos

data <- read_csv("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv")
head(data)
## # A tibble: 6 × 676
##   `Province/State` `Country/Region`     Lat   Long `1/22/20` `1/23/20` `1/24/20`
##   <chr>            <chr>              <dbl>  <dbl>     <dbl>     <dbl>     <dbl>
## 1 <NA>             Afghanistan         33.9  67.7          0         0         0
## 2 <NA>             Albania             41.2  20.2          0         0         0
## 3 <NA>             Algeria             28.0   1.66         0         0         0
## 4 <NA>             Andorra             42.5   1.52         0         0         0
## 5 <NA>             Angola             -11.2  17.9          0         0         0
## 6 <NA>             Antigua and Barbu…  17.1 -61.8          0         0         0
## # … with 669 more variables: 1/25/20 <dbl>, 1/26/20 <dbl>, 1/27/20 <dbl>,
## #   1/28/20 <dbl>, 1/29/20 <dbl>, 1/30/20 <dbl>, 1/31/20 <dbl>, 2/1/20 <dbl>,
## #   2/2/20 <dbl>, 2/3/20 <dbl>, 2/4/20 <dbl>, 2/5/20 <dbl>, 2/6/20 <dbl>,
## #   2/7/20 <dbl>, 2/8/20 <dbl>, 2/9/20 <dbl>, 2/10/20 <dbl>, 2/11/20 <dbl>,
## #   2/12/20 <dbl>, 2/13/20 <dbl>, 2/14/20 <dbl>, 2/15/20 <dbl>, 2/16/20 <dbl>,
## #   2/17/20 <dbl>, 2/18/20 <dbl>, 2/19/20 <dbl>, 2/20/20 <dbl>, 2/21/20 <dbl>,
## #   2/22/20 <dbl>, 2/23/20 <dbl>, 2/24/20 <dbl>, 2/25/20 <dbl>, …

Como podemos observar tenemos un conjunto de datos donde las fechas están almacenas como columnas, esté debería estár almacenado en una sola columna llamada años y cada país debería tener la suma total de personas fallecidas. Para estructurar los datos de forma correcta usaremos dos funciones estás son pivot_longer() y pivot_wider().

Fig. 05: Infografía de pivot realizado por Dr. Peter D.R. Higgins

✅ 2.2 Untidy data ▶ tidydata

La funcion pivot_longer convierte los datos de un formato ancho a uno largo

Fig. 06: Transformación de datos,2021,Data Analytics Coding Fundamentals (

data %>% 
  pivot_longer(
    cols = !c("Province/State","Country/Region","Lat","Long"),
    names_to = "years",
    values_to = "fallecidos",
    values_drop_na = TRUE 
    ) %>% 
  head()
## # A tibble: 6 × 6
##   `Province/State` `Country/Region`   Lat  Long years   fallecidos
##   <chr>            <chr>            <dbl> <dbl> <chr>        <dbl>
## 1 <NA>             Afghanistan       33.9  67.7 1/22/20          0
## 2 <NA>             Afghanistan       33.9  67.7 1/23/20          0
## 3 <NA>             Afghanistan       33.9  67.7 1/24/20          0
## 4 <NA>             Afghanistan       33.9  67.7 1/25/20          0
## 5 <NA>             Afghanistan       33.9  67.7 1/26/20          0
## 6 <NA>             Afghanistan       33.9  67.7 1/27/20          0

De está estructura de datos podemos notar que en la primera columna presenta datos faltantes (NA), para remover usaremos la función drop_na especificando el nombre de la columna.

data %>% 
  pivot_longer(
    cols = !c("Province/State","Country/Region","Lat","Long"),
    names_to = "years",
    values_to = "fallecidos",
    values_drop_na = TRUE 
    ) %>% 
  drop_na(`Province/State`) -> data_long
data_long
## # A tibble: 58,464 × 6
##    `Province/State`             `Country/Region`   Lat  Long years   fallecidos
##    <chr>                        <chr>            <dbl> <dbl> <chr>        <dbl>
##  1 Australian Capital Territory Australia        -35.5  149. 1/22/20          0
##  2 Australian Capital Territory Australia        -35.5  149. 1/23/20          0
##  3 Australian Capital Territory Australia        -35.5  149. 1/24/20          0
##  4 Australian Capital Territory Australia        -35.5  149. 1/25/20          0
##  5 Australian Capital Territory Australia        -35.5  149. 1/26/20          0
##  6 Australian Capital Territory Australia        -35.5  149. 1/27/20          0
##  7 Australian Capital Territory Australia        -35.5  149. 1/28/20          0
##  8 Australian Capital Territory Australia        -35.5  149. 1/29/20          0
##  9 Australian Capital Territory Australia        -35.5  149. 1/30/20          0
## 10 Australian Capital Territory Australia        -35.5  149. 1/31/20          0
## # … with 58,454 more rows

Ahora de este formato largo podemos pasar a un formato ancho usando la función pivot_wider.

data_long %>% 
  pivot_wider(
    names_from = years,
    values_from = fallecidos) -> data_wide
data_wide
## # A tibble: 87 × 676
##    `Province/State`   `Country/Region`   Lat  Long `1/22/20` `1/23/20` `1/24/20`
##    <chr>              <chr>            <dbl> <dbl>     <dbl>     <dbl>     <dbl>
##  1 Australian Capita… Australia        -35.5  149.         0         0         0
##  2 New South Wales    Australia        -33.9  151.         0         0         0
##  3 Northern Territory Australia        -12.5  131.         0         0         0
##  4 Queensland         Australia        -27.5  153.         0         0         0
##  5 South Australia    Australia        -34.9  139.         0         0         0
##  6 Tasmania           Australia        -42.9  147.         0         0         0
##  7 Victoria           Australia        -37.8  145.         0         0         0
##  8 Western Australia  Australia        -32.0  116.         0         0         0
##  9 Alberta            Canada            53.9 -117.         0         0         0
## 10 British Columbia   Canada            53.7 -128.         0         0         0
## # … with 77 more rows, and 669 more variables: 1/25/20 <dbl>, 1/26/20 <dbl>,
## #   1/27/20 <dbl>, 1/28/20 <dbl>, 1/29/20 <dbl>, 1/30/20 <dbl>, 1/31/20 <dbl>,
## #   2/1/20 <dbl>, 2/2/20 <dbl>, 2/3/20 <dbl>, 2/4/20 <dbl>, 2/5/20 <dbl>,
## #   2/6/20 <dbl>, 2/7/20 <dbl>, 2/8/20 <dbl>, 2/9/20 <dbl>, 2/10/20 <dbl>,
## #   2/11/20 <dbl>, 2/12/20 <dbl>, 2/13/20 <dbl>, 2/14/20 <dbl>, 2/15/20 <dbl>,
## #   2/16/20 <dbl>, 2/17/20 <dbl>, 2/18/20 <dbl>, 2/19/20 <dbl>, 2/20/20 <dbl>,
## #   2/21/20 <dbl>, 2/22/20 <dbl>, 2/23/20 <dbl>, 2/24/20 <dbl>, …

🔴 Referencias